package com.zhd.springboot.starter.car.config;

import com.zhd.springboot.starter.car.CarProperties;
import com.zhd.springboot.starter.car.service.CarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zhanghaidong
 * @version v1.0
 * @description
 * @date 2019/6/24
 *
 * // 配置注解  ,标记该类是个配文类
 * @Configuration
 * // 开启指定类的配置，既是接受配置文件中的参数的类， 多个时我们可以这么写value={Properties1.class,Properteis2.class....}
 * @EnableConfigurationProperties(CarProperties.class)
 * // 当这个类（CarService）在classPath下，并且容器 中没有相同的，就自动配置
 * @ConditionalOnClass(CarService.class)
 * // 表示只有我们的配置文件是否配置了以car为前缀的资源项值，并且在该资源项值为enabled，如果没有配置我们默认设置为enabled
 * @ConditionalOnProperty(prefix="car", value="enabled", matchIfMissing=true)
 *
 *
 * @ConditionalOnBean:当容器中有指定的Bean的条件下
 * @ConditionalOnClass：当类路径下有指定的类的条件下
 * @ConditionalOnExpression:基于SpEL表达式作为判断条件
 * @ConditionalOnJava:基于JVM版本作为判断条件
 * @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
 * @ConditionalOnMissingBean:当容器中没有指定Bean的情况下
 * @ConditionalOnMissingClass:当类路径下没有指定的类的条件下
 * @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
 * @ConditionalOnProperty:指定的属性是否有指定的值
 * @ConditionalOnResource:类路径下是否有指定的资源
 * @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个，或者在有多个Bean的情况下，用来指定首选的Bean
 * @ConditionalOnWebApplication:当前项目是Web项目的条件下
 */
@Configuration
@EnableConfigurationProperties(CarProperties.class)
@ConditionalOnClass(CarService.class)
@ConditionalOnProperty(prefix="car", value="enabled", matchIfMissing=true)
public class CarAutoConfiguration {

    @Autowired
    private CarProperties properties;

    /**
     * 当容器中没有指定Bean的情况下，自动配置carService类
     * @return
     */
    @Bean
    @ConditionalOnMissingBean(CarService.class)
    public CarService carService(){
        System.out.println("------------------加载CarService-----------------------");
        CarService personService = new CarService(properties);
        return personService;
    }
}
